// 对axios进行二次封装（实例化axios对象、设置请求拦截器、设置响应拦截器）

import axios from 'axios'

// 实例化axios对象
var service = axios.create({
    // baseURL:'/api',    //基准路径，实际发请求时，每个请求地址前都会自动拼接上该基准路径

    // 在开发环境下，process.env.REACT_APP_BASE_URL 会自动找 .env.development 文件中的变量
    // 在生产环境下，process.env.REACT_APP_BASE_URL 会自动找 .env.production 文件中的变量

    // 在开发环境下 代理文件 setupProxy.js 会生效，跨域问题就会通过代理的请求转发解决.
    // 在生产环境下（服务器环境下） 代理文件 setupProxy.js 文件不存在了，代理也就不生效了，而之后的跨域问题由后端在服务器解决.
    baseURL: process.env.REACT_APP_BASE_URL,    //这是通过后端的语言（nodeJs），通过.env.development文件将 /api 基准路径变为全局变量（也叫环境变量），通过这个访问---process.env.REACT_APP_BASE_URL （process.env.REACT_APP_BASE_URL就等于 /api ）
    timeout: 10*1000,    //超时时间
})

// 设置请求拦截器
service.interceptors.request.use(
    // 请求成功回调
    (config)=>{
        // 一般情况下，在这里设置请求头（这些请求头应该是服务端必须要求携带的）
        // Authorization--这是请求头，具体用什么请求头，由公司后端决定；有些公司用的是--XToken
        // 设置请求头有两种写法(其实就是给headers这个对象里增添属性的)
            // 方法一
        config.headers.Authorization = "Bearer" + " " + localStorage.getItem("token");
            // 方法二
        // config.headers["Authorization"] = "Bearer" + " " + localStorage.getItem("token");
        return config;
    },
    // 请求失败回调
    (error)=>{
        return Promise.reject(error)
    }
)

// 设置响应拦截器
service.interceptors.response.use(
     // 请求成功回调
     (res)=>{
        return res;
    },
    // 请求失败回调
    (error)=>{
        // 一般情况下,在这里处理服务端返回的错误码
        if (error.response.status == 401) {
            alert('身份验证失败,登录过期,请重新登录');
            // 跳转到登录页
            // 删除过期的token
        } else if (error.response.status == 404) {
            alert('访问路径有误!');
        } else if (error.response.status == 500) {
            alert('服务器内部错误!');
        }
        return Promise.reject(error)
    }
)

export default service;